#ifndef LEETCODE_CN_CPP_PROBLEMS_225_H
#define LEETCODE_CN_CPP_PROBLEMS_225_H

#include <memory>
#include <queue>

using namespace std;

namespace problem_225
{

class MyStack
{
private:
    unique_ptr<queue<int>> queue1;
    unique_ptr<queue<int>> queue2;

public:
    MyStack()
    {
        queue1 = make_unique<queue<int>>();
        queue2 = make_unique<queue<int>>();
    }

    void push(int x)
    {
        queue1->push(x);
    }

    int pop()
    {
        while (queue1->size() > 1)
        {
            queue2->push(queue1->front());
            queue1->pop();
        }
        int result = queue1->front();
        queue1->pop();
        swap(queue1, queue2);
        return result;
    }

    int top()
    {
        while (queue1->size() > 1)
        {
            queue2->push(queue1->front());
            queue1->pop();
        }
        int result = queue1->front();
        queue1->pop();
        queue2->push(result);
        swap(queue1, queue2);
        return result;
    }

    bool empty()
    {
        return queue1->empty() && queue2->empty();
    }
};

} // namespace problem_225

#endif //LEETCODE_CN_CPP_PROBLEMS_225_H
